#!usr/bin/perl -w

############################################
#	Grupo 06 - 2012 2° Cuatrimestre    #
#    	   Comando MirarW5.pl 		   #
############################################

# se invoca: MirarW5.pl -c=[comando] -n=[cant lineas]* -s=[cadena]*
# * puede ser uno, el otro, o ambos
# [comando] es el nombre del comando que se desea visualizar el archivo
# de log. 

$LOGDIR = $ENV{LOGDIR};
$LOGEXT = $ENV{LOGEXT};

# Recibe cadena y una referencia donde guardo lo que esta
# despues del igua
sub parsear($\$){
    @values = split('=', $_[0]);
    ${$_[1]} = $values[1];	
}


# Recibe el nombre de un archivo y una cadena.
# Muestra por pantalla las apariciones de la cadena en el archivo
sub muestraPorCadena($$) {
	return `grep $_[1] $_[0]`;
}

# Recibe el nombre de un archivo y una cantidad n de líneas.
# Muestra por pantalla las últimas n líneas del archivo
sub muestraPorLinea($$) {
	return `tail -n $_[1] $_[0]`;
}

# Recibe el nombre de un archivo, una cadena y una cantidad n de líneas
# Muestras las últimas n líneas con la cadena
sub combinado($$$) {
	return `grep $_[1] $_[0] | tail -n $_[2]`;
}


sub imprimeResultados(@) {
	foreach (@_) {
		@cad = split('-', $_);
		print "FECHA:$cad[0], USER:$cad[1], MOTIVO:$cad[3], MENSAJE: $cad[4]"
	}
}


sub main() {
	local($comando,$cantLineas, $cadena, $n, $s, $archivo); 
	$n = $s = 0;
	$comando = "";
	@vec = ();
	foreach (@ARGV) {
		if ($_ =~ /-c=/) {
			parsear($_,$comando);
		} elsif ($_ =~ /-s=/) {
			parsear($_,$cadena);
			$s = 1;
		} elsif ($_ =~ /-n=/) {
			parsear($_,$cantLineas);
			$n = 1;
		}
	}
	if ( ! $comando){
		print "ERROR: No se especifico el comando del log a ser evaluado. Usar la opcion -c=.. para su evaluacion.\n";
		return;
	}
	$archivo = $LOGDIR . $comando . ".$LOGEXT";
	if ( ! -e $archivo) {
		print "ERROR: No existe archivo de log relacionado al comando $comando\n";
		return;
	}

	$cantLineas = abs($cantLineas);
	if ($n && $s) {
		@vec = combinado($archivo, $cadena, $cantLineas); 
	} elsif ( $s ) {
		@vec = muestraPorCadena($archivo, $cadena);
	} elsif ( $n ) {
		@vec = muestraPorLinea($archivo, $cantLineas);
	} else {
		print "No se especifico ningun tipo de filtro. Usar las opciones -n=.. (cantidad de lineas) y/o -s=.. (patron de caracteres).\n";
		return;
	}
	imprimeResultados(@vec);
	
	$n_lineas = @vec;
	if ($s && $n_lineas == 0) {
		print "No hay coincidencias de la cadena $cadena en el archivo $archivo\n";
	} elsif ($n && $n_lineas < $cantLineas) {
		print "No hay más líneas que mostrar. El archivo contiene $n_lineas líneas\n"
	}
}

main();
